from flask import Flask
from flask_login import LoginManager
from app.models.book import db
from flask_mail import Mail

login_manager = LoginManager()
mail = Mail()


def create_app():
    """
    创建flask应用对象
    :return:
    """
    # 实例化应用对象
    app = Flask(__name__, static_folder='static')
    # 导入配置文件并注册到应用对象
    app.config.from_object('app.secure')
    app.config.from_object('app.setting')
    # 注册蓝图到应用对象
    register_blueprint(app)
    # 初始化db并注册到应用对象
    db.init_app(app)
    # 注册mail到应用对象
    mail.init_app(app)
    # 初始化login_manager并注册到应用对象
    login_manager.init_app(app)
    login_manager.login_view = 'web.login'
    login_manager.login_message = '请先登录或注册'
    # 射数据模型到数据库
    db.create_all(app=app)  # 方法1:手动传入应用对象
    # with app.app_context():  # 方法2：使用应用上下文，将应用对象推入堆栈中 方法3：在初始化sqlalchemy时传入应用对象
    # db.create_all
    return app


def register_blueprint(app):
    from app.blueprint.web.book import web
    app.register_blueprint(web)
